package com.bruce.demo2.patterns.demo1.creational.demo01.singleton.demo10;

import java.io.Serializable;

/**
 * @PROJECT_NAME design_patterns
 * @DESCRIPTION 反射破坏单例的解决方案
 * 通过静态成员属性flag 在构造方法中添加判断，使其只能实例化一次
 * @AUTHOR CNBruceLee
 * @DATE 2021/7/8 19:51
 */
public class Singleton implements Serializable {
    private static boolean flag = false;

    //1、私有化构造方法
    private Singleton() {
        //反射调用时如果对象不为空则抛出异常
        synchronized (Singleton.class) {//加锁
            if (flag) {
                throw new RuntimeException("不能创建多个对象");
            }
            flag = true;
        }
    }

    //2、定义内部类中生成实例
    private static class SingletonInner {
        public static final Singleton INSTANCE = new Singleton();
    }

    //3、对外提供实例的获取方法
    public static Singleton getInstance() {
        return SingletonInner.INSTANCE;
    }

    //反序列化时，反射生产对象会检查是否有readResolve方法，有则执行没有则执行new一个新对象，所以此处添加此方法返回已有实例
    public Object readResolve() {
        return SingletonInner.INSTANCE;
    }
}
